package com.xiaotu.storage.converter;

import java.util.ArrayList;
import java.util.List;


import com.xiaotu.common.exception.SpiderException;
import com.xiaotu.common.exception.SpiderExceptionCode;
import com.xiaotu.common.util.SpringContextHolder;

import net.sf.json.JSONObject;

/**
 * @类名 ConverterFactory
 * @日期 2017年2月21日
 * @作者 高海军
 * @功能 转换器工厂
 */
public class ConverterFactory
{
	/**
	 * 将缓存数据的字段列表对应的每一个值转成指定的类型
	 * @param target 缓存数据
	 * @param fields 字段列表
	 * @param converters 转换器列表
	 * @param expThrow 不满足转换条件是否抛异常
	 * @return 转换结果
	 */
	public static List<Object> convert(JSONObject target, String[] fields,
			String[] converters, boolean[] expThrow)
	{
		if (target == null || target.isEmpty())
			throw new SpiderException(
					SpiderExceptionCode.DataObjectEmptyException);
		List<Object> resultList = new ArrayList<Object>();
		for (int i = 0; i < fields.length; i++)
			resultList.add(
					convert(target, fields[i], converters[i], expThrow[i]));
		return resultList;
	}
	
	/**
	 * 将缓存数据的指定字段的值转成指定的类型
	 * @param target 缓存数据
	 * @param field 字段
	 * @param converter 转换器
	 * @param expThrow 不满足转换条件是否抛异常，为null也不满足转换条件（string转换器除外）
	 * @return 转换结果
	 */
	public static Object convert(JSONObject target, String field,
			String converter, boolean expThrow)
	{
		return SpringContextHolder
				.getBean(converter + "Converter", AConverter.class)
				.convert(target.has(field) ? target.getString(field) : null,
						target, expThrow);
	}
}
